var DebugConfig = {
    Debug: false,//是否调试
    ConsoleLog: true,//是否控制台输出日志
    Message: true,//是否弹出具体消息
    Request: true,//请求调试
    Drawing: false,//渲染调试
};

const base = new Object();

/**
 * 公共请求数据方法
 * @method
 * @param {JSON} data 请求参数
 * @param {JSON} _this VUE对象
 * @returns {JSON} 请求对象
 */
base.request = function (data, _this) {
    var requestObj = new Object();
    var successfn = null;
    var errorfn = null;
    var index = 0;
    requestObj.success = function (fn) {
        successfn = fn;
        return requestObj;
    };
    requestObj.error = function (fn) {
        errorfn = fn;
    };
    var timeStart = null;
    if (DebugConfig.Debug) {
        //Debug模式计算请求耗时
        timeStart = new Date();
        //_this未传消息无法正常显示，加提示
        if (!_this) {
            console.error("URL:" + data.url + ",_this为undefined");
        }
    }
    var timeBack = null;

    function ajax() {
        axios.post(data.url, data.params).then(function (resp) {
            if (DebugConfig.Debug) {
                timeBack = new Date();
                //计算耗时
                var timeResult = new Date().getTime() - timeStart.getTime();
                var msg = "请求耗时：" + parseInt(timeResult / 1000) + "秒" + (timeResult % 1000) + "毫秒";
                //消息提示耗时
                if (_this && DebugConfig.Message && DebugConfig.Request) {
                    if (parseInt(timeResult / 1000) >= 2) {
                        _this.$message({type: "error", message: msg});
                    } else {
                        _this.$message({message: msg});
                    }
                }
                //控制台显示耗时
                if (DebugConfig.ConsoleLog && DebugConfig.Request) {
                    msg = "URL:" + data.url + ",Params:" + JSON.stringify(data.params) + "," + msg;
                    if (parseInt(timeResult / 1000) >= 2) {
                        console.error(msg);
                    } else {
                        console.log(msg);
                    }
                }
            }
            //请求正常，后端异常
            if (resp && resp.code != 0) {
                _this.closeAll();
                base.error(resp.msg);
                return;
            }

            //请求正常，后端登录过期返回登录界面
            // if (resp.request.responseText.indexOf("<!DOCTYPE html>") > -1) {
            //     window.top.location = '/account/login';
            //     return;
            // }
            //箭头函数调用成功方法
            if (successfn) {
                successfn(resp);
            }
            //JSON方式调用成功方法
            if (data.success) {
                data.success(resp);
            }
            //调试下计算渲染时间 
            if (DebugConfig.Debug && _this) {
                _this.$nextTick(function () {
                    var timeResult = new Date().getTime() - timeBack.getTime();
                    var msg = "渲染耗时：" + timeResult + "毫秒";
                    if (DebugConfig.Message && DebugConfig.Drawing) {
                        if (timeResult > 100) {
                            _this.$message({type: "error", message: msg});
                        } else {
                            _this.$message({message: msg});
                        }
                    }
                    if (DebugConfig.ConsoleLog && DebugConfig.Drawing) {
                        if (timeResult > 100) {
                            console.error("URL:" + data.url + "," + msg);
                        } else {
                            console.log("URL:" + data.url + "," + msg);
                        }
                    }
                });
            }
        }).catch(function (resp) {
            //服务器报错重试一次
            if (resp.response && resp.response.status == 500 && index == 0) {
                index++;
                ajax();
                return;
            }
            //异常处理
            _this.loading = false;
            var msg = '请求失败：' + resp.msg;
            base.error(msg);
            //箭头函数调用异常方法
            if (errorfn) {
                errorfn(resp);
            }
            //JSON方式调用异常方法
            if (data.error) {
                data.error(resp);
            }
        });
    }


    ajax();

    return requestObj;
}

base.error = function (msg) {
    window.parent.error(msg);
}